home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 52 / Amiga Format AFCD52 (Issue 136, May 2000).iso / -in_the_mag- / reader_requests / wild / support / profiler.s < prev    next >
Text File  |  2000-02-23  |  7KB  |  388 lines

  1.  
  2.     include    exec/exec_lib.i
  3.     include    libraries/dos_lib.i
  4.     include    exec/io.i
  5.     include    dos/dos.i
  6.     include    devices/timer.i
  7.     include    devices/timer_lib.i
  8.     include    pypermacro.i
  9.  
  10. Timer    MACRO
  11.     movea.l    TimerBase,a6
  12.     ENDM
  13.  
  14. Dos    MACRO
  15.     movea.l    DOSBase,a6
  16.     ENDM
  17.  
  18.     bsr    InitTimerDevice
  19.     bsr    Profiler
  20.     bsr    FlushTimerDevice    
  21.     rts
  22.  
  23.         cnop    0,4
  24. Routines    dc.l    null,r1,r2
  25. RoutinesEnd    dc.l    0
  26.  
  27.         cnop    0,4
  28. null        rts
  29.  
  30.         cnop    0,4
  31. r1        move.l    a7,a0
  32.         move.l    d2,-(a7)
  33.         move.l    d2,-(a7)
  34.         moveq.l    #1,d0
  35.         moveq.l    #1,d1
  36.         add.l    d0,d0
  37.         add.l    d1,d1
  38.         move.l    a0,a7
  39.         rts
  40.  
  41.         cnop    0,4
  42. r2        move.l    a7,a0
  43.         move.l    d2,-(a7)
  44.         move.l    d2,-(a7)
  45.         moveq.l    #1,d0
  46.         moveq.l    #1,d1
  47.         add.l    d0,d0
  48.         add.l    d1,d1
  49.         move.l    a0,a7
  50.         rts
  51.  
  52. ***************************************************************************************
  53. *** Profiler                                     *******
  54. ***************************************************************************************
  55.  
  56.         cnop    0,4
  57. DOSBase        dc.l    0
  58. OutFH        dc.l    0
  59. RDArgs        dc.l    0
  60. Args
  61. NTests        dc.l    0
  62. Forbid        dc.l    0
  63. Disable        dc.l    0
  64. StartTime    dc.l    0,0
  65. EndTime        dc.l    0,0
  66. Times        dc.l    0
  67. Tests        dc.l    0
  68.  
  69. OutNum    MACRO    ; \1=ea (of num) \2=4char
  70.     movem.l    d0-d3/a0-a1/a6,-(a7)
  71.     Dos
  72.     move.l    #'\2',tmp
  73.     lea.l    tmpn,a0
  74.     move.l    \1,d0
  75.     moveq.l    #10,d1
  76.     bsr    WriteDec
  77.     move.l    OutFH,d1
  78.     move.l    #tmp,d2
  79.     move.l    #tmpend-tmp,d3
  80.     Call    Write
  81.     movem.l    (a7)+,d0-d3/a0-a1/a6
  82.     ENDM
  83.  
  84. Profiler    Exec
  85.         move.l    #4*256,d0
  86.         moveq.l    #0,d1
  87.         Call    AllocVec
  88.         move.l    d0,Times
  89.         lea.l    DosName,a1
  90.         moveq.l    #33,d0
  91.         Call    OpenLibrary
  92.         move.l    d0,DOSBase
  93.         beq    exit
  94.         movea.l    d0,a6
  95.         Call    Output
  96.         move.l    d0,OutFH
  97.         move.l    #Template,d1
  98.         move.l    #Args,d2
  99.         moveq.l    #0,d3
  100.         Call    ReadArgs
  101.         move.l    d0,RDArgs
  102.         beq    exit
  103.         move.l    OutFH,d1
  104.         move.l    #Intro,d2
  105.         move.l    #IntroEnd-Intro,d3
  106.         Call    Write
  107.         move.l    NTests,a0
  108.         move.l    (a0),Tests
  109.  
  110.         Exec
  111.         tst.l    Forbid
  112.         beq.b    .nf
  113.         Call    Forbid
  114. .nf        tst.l    Disable
  115.         beq.b    .nd
  116.         Call    Disable
  117. .nd
  118.                     ; a2:testnum
  119. Prof        move.l    Times,a3    ; a3:time storing
  120.         lea.l    Routines,a4    ; a4:routines
  121. .loop        move.l    (a4)+,d0
  122.         beq    .end
  123.         move.l    d0,a2        ; a2:routine
  124.         move.l    Tests,d7    ; d7:count
  125.         
  126. *        OutNum    d7,TEST
  127.         
  128.         subq.l    #1,d7
  129.         movem.l    a3/a4,-(a7)
  130.         Exec
  131.         Call    CacheClearE
  132.         bra.b    .entry
  133.  
  134.         cnop    0,4
  135. .entry        movea.l    TimerBase(pc),a6
  136.         lea.l    StartTime,a0
  137.         Call    ReadEClock
  138. .redo        movem.l    d7/a2,-(a7)
  139.         jsr    (a2)
  140.         movem.l    (a7)+,d7/a2
  141.         subq.l    #1,d7
  142.         bpl.b    .redo
  143.         movea.l    TimerBase(pc),a6
  144.         lea.l    EndTime,a0
  145.         Call    ReadEClock 
  146.         movem.l    (a7)+,a3/a4
  147.  
  148. *        OutNum    StartTime,STd0
  149. *        OutNum    StartTime+4,STd1
  150. *        OutNum    EndTime,ENd0
  151. *        OutNum    EndTime+4,ENd1
  152.  
  153.         movea.l    TimerBase(pc),a6
  154.         lea.l    StartTime,a1
  155.         lea.l    EndTime,a0
  156.         Call    SubTime
  157.  
  158.         lea.l    EndTime,a0
  159.         move.l    (a0)+,(a3)+
  160.         move.l    (a0)+,(a3)+
  161.  
  162.         bra    .loop
  163. .end    
  164.         Exec
  165.         tst.l    Forbid
  166.         beq.b    .np
  167.         Call    Permit    
  168. .np        tst.l    Disable
  169.         beq.b    .ne
  170.         Call    Enable
  171. .ne
  172.         Dos
  173.         move.l    OutFH,d1
  174.         move.l    #Real,d2
  175.         move.l    #RealEnd-Real,d3
  176.         Call    Write
  177.         lea.l    Routines,a2
  178.         movea.l    Times,a3
  179.         lea.l    Units,a4
  180.         moveq.l    #0,d7        ; d7=routine cnt
  181. View        move.l    (a2)+,d0
  182.         beq    .end
  183.         move.l    d7,d2
  184.         lea.l    Result_rt,a0
  185.         move.l    (a3)+,d0
  186.         move.l    (a3)+,d1
  187.         bsr    WriteResult
  188.         addq.w    #1,d7
  189.         bra    View
  190. .end
  191.         Dos
  192.         move.l    OutFH,d1
  193.         move.l    #Pure,d2
  194.         move.l    #PureEnd-Pure,d3
  195.         Call    Write
  196.         lea.l    Routines+4,a2
  197.         movea.l    Times,a3
  198.         move.l    (a3)+,d3
  199.         move.l    (a3)+,d4    ; d3/d4: NULL ROUTINE times.
  200.         lea.l    Units,a4
  201.         moveq.l    #1,d7        ; d7=routine cnt
  202. ViewPure    move.l    (a2)+,d0
  203.         beq    .end
  204.         move.l    d7,d2
  205.         lea.l    Result_rt,a0
  206.         move.l    (a3)+,d0
  207.         move.l    (a3)+,d1
  208.         sub.l    d4,d1
  209.         subx.l    d3,d0
  210.         bsr    WriteResult
  211.         addq.w    #1,d7
  212.         bra    ViewPure
  213. .end    
  214.         Dos
  215.         move.l    OutFH,d1
  216.         move.l    #Single,d2
  217.         move.l    #SingleEnd-Single,d3
  218.         Call    Write
  219.         lea.l    Routines+4,a2
  220.         movea.l    Times,a3
  221.         move.l    (a3)+,d3
  222.         move.l    (a3)+,d4    ; d3/d4: NULL ROUTINE times.
  223.         move.l    Tests,d5    ; d5:N of tests
  224.         lea.l    Units,a4
  225.         moveq.l    #1,d7        ; d7=routine cnt
  226. ViewSingle    move.l    (a2)+,d0
  227.         beq    .end
  228.         move.l    d7,d2
  229.         lea.l    Result_rt,a0
  230.         move.l    (a3)+,d0
  231.         move.l    (a3)+,d1
  232.         sub.l    d4,d1
  233.         subx.l    d3,d0
  234.         divs.l    d5,d0:d1
  235.         moveq.l    #0,d0        ; ERROR IF A SINGLE CALL USES MORE THAN $ffffffff E Clocks. I THINK WILL NEVER HAPPEN !!!!        
  236.         bsr    WriteResult
  237.         addq.w    #1,d7
  238.         bra    ViewSingle
  239. .end    
  240.  
  241.  
  242. exit        Dos
  243.         move.l    a6,d0
  244.         beq.b    .ndos
  245. ***        move.l    RDArgs,d0
  246. ***        beq.b    .narg
  247. ***        Call    FreeArgs        
  248. .narg        Exec
  249.         movea.l    DOSBase,a1
  250.         Call    CloseLibrary
  251. .ndos        Exec
  252.         move.l    Times,d0
  253.         beq.b    .nstk
  254.         movea.l    d0,a1
  255.         Call    FreeVec
  256. .nstk        rts
  257.  
  258. ; in: d0/d1:EClock d2:ResNumber
  259.  
  260. WriteResult    movem.l    d2-d3/a6,-(a7)
  261.         tst.l    d0
  262.         bpl.b    .nbad
  263.         move.l    OutFH,d1
  264.         move.l    #Bad,d2
  265.         move.l    #BadEnd-Bad,d3
  266.         Call    Write
  267.         bra.b    .exit        
  268. .nbad        lea.l    Result_rt,a0
  269.         exg    d0,d2
  270.         move.l    d1,d3
  271.         moveq.l    #3,d1
  272.         bsr    WriteDec
  273.         move.l    d3,d1
  274.         move.l    d2,d0
  275.         moveq.l    #0,d3        ; d3=unit
  276.         bra.b    .entry1
  277. .unit        ror.l    #8,d0
  278.         ror.l    #2,d0
  279.         lsr.l    #8,d1
  280.         lsr.l    #2,d1
  281.         move.l    d0,d2
  282.         andi.l    #$007fffff,d2
  283.         or.l    d2,d1
  284.         andi.l    #$ffc00000,d0
  285.         addq.w    #1,d3
  286. .entry1        tst.l    d0
  287.         bne.b    .unit        
  288.         move.b    (a4,d3.l),Result_un
  289.         move.l    d1,d0
  290.         moveq.l    #10,d1
  291.         lea.l    Result_et,a0
  292.         bsr    WriteDec
  293.         Dos
  294.         move.l    OutFH,d1
  295.         move.l    #Result,d2
  296.         move.l    #ResultEnd-Result,d3
  297.         Call    Write
  298. .exit        movem.l    (a7)+,d2-d3/a6
  299.         rts                
  300.         
  301. ***************************************************************************************
  302. *** WriteDec: A0=buffer,D0=Num,D1=Cyfs                        *******
  303. ***************************************************************************************
  304.  
  305. Cyf        dc.b    'xx9876543210'
  306. WriteDec    movem.l    d2-d3,-(a7)
  307.         moveq.l    #1,d2
  308.         moveq.l    #10,d3
  309.         clr.l    -(a7)
  310.         bra.b    .entry
  311. .divs        move.l    d2,-(a7)
  312.         mulu.l    d3,d2
  313. .entry        dbra    d1,.divs
  314. .dodivs        move.l    (a7)+,d1
  315.         beq.b    .end
  316.         moveq.l    #10,d2
  317. .dodiv        sub.l    d1,d0
  318.         dbmi    d2,.dodiv
  319.         add.l    d1,d0
  320.         move.b    Cyf+1(pc,d2.w),(a0)+
  321.         bra.b    .dodivs
  322. .end        movem.l    (a7)+,d2-d3
  323.         rts
  324.  
  325. ***************************************************************************************
  326. *** Timer device init                                *******
  327. ***************************************************************************************
  328.  
  329. TimerMsg    dc.l    0
  330. TimerIO        dc.l    0
  331. TimerBase    dc.l    0
  332. InitTimerDevice    Exec
  333.         Call    CreateMsgPort
  334.         move.l    d0,TimerMsg
  335.         movea.l    d0,a0
  336.         moveq.l    #IOTV_SIZE,d0
  337.         Call    CreateIORequest
  338.         move.l    d0,TimerIO
  339.         lea.l    TimerName,a0
  340.         movea.l    d0,a1
  341.         moveq.l    #0,d0
  342.         move.l    d0,d1
  343.         Call    OpenDevice
  344.         tst.l    d0
  345.         bne.b    ITD_Error
  346.         moveq.l    #-1,d1
  347.         movea.l    TimerIO(pc),a0
  348.         move.l    IO_DEVICE(a0),TimerBase
  349.         rts
  350. ITD_Error    moveq.l    #0,d0
  351.         rts
  352.  
  353. FlushTimerDevice Exec
  354.         movea.l    TimerIO(pc),a1
  355.         Call    CloseDevice
  356.         movea.l    TimerIO(pc),a0
  357.         Call    DeleteIORequest
  358.         movea.l    TimerMsg(pc),a0
  359.         Call    DeleteMsgPort
  360.         rts
  361.  
  362.  
  363. NL    EQU    10        
  364. TimerName    dc.b    'timer.device',0
  365. DosName        dc.b    'dos.library',0
  366.         dc.b    0,'$VER:'
  367. Intro        dc.b    'Pyper Profiler System. V0.8 (12.09.98)',0,NL
  368. IntroEnd
  369. Template    dc.b    'TESTS/N/A,FORBID/S,DISABLE/S',0        
  370. Bad        dc.b    'Bad result of this routine.',NL
  371. BadEnd
  372. Result        dc.b    'Routine '
  373. Result_rt    dc.b    '___ took '
  374. Result_et    dc.b    '__________ E Clock '
  375. Result_un    dc.b    ' ticks.',NL
  376. ResultEnd
  377. Pure        dc.b    NL,'Pure results:',NL
  378. PureEnd
  379. Real        dc.b    NL,'Real results:',NL
  380. RealEnd
  381. Single        dc.b    NL,'Single call results:',NL
  382. SingleEnd
  383. Units        dc.b    ' kMGT***'
  384.  
  385. tmp        dc.b    'xxxx'
  386. tmpn        dc.b    'xxxxxxxxxx',NL
  387. tmpend
  388.